<?php
/*

  Copyright (c) 2008   by  maxim.oransky <maxim.oransky@gmail.com>,
  auhtor of  the-wheel-library  team

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

class WikiFormatter {

	private static $arrFrom = null;
	private static $arrTo = null;

	public static function process($str) {

		if (self::$arrFrom === null && self::$arrTo === null) {
			list(self::$arrFrom, self::$arrTo) = self::getRules();
		}

		return preg_replace(self::$arrFrom, self::$arrTo, $str);
	}

	private static function getRules() {

		$hRules = array(
//			# удаляем из текста все комментарии
//			$text[^text.match[^^#.*^$\n][gim]{}]
			'/^#.*$\n/m' => '',

////			# все повторы переносов строк больше двух меняем на два
////			$text[^text.match[\n(\s+)?\n][gim]{
////
////			}]
//			'/\n(\s+)?\n/m' => "\n\n",

//			# ============ Заголовки ============
			'/^====([^\n]*)====/m' => '<h3>$1</h3>',
			'/^===([^\n]*)===/m' => '<h2>$1</h2>',
			'/^==([^\n]*)==/m' => '<h1>$1</h1>',

//			# ============ Список ============
//			# всё сначала меняем на маски, чтобы не перекрыть <li>, которые мы вносим руками в код
//			$text[^text.match[^^  \* (.*)^$][gim]{RegexpMaskA1${match.1}RegexpMaskA2}]
			'/^  \* (.*)$/m' => 'RegexpMaskA1$1RegexpMaskA2',

//			# -- меняем все <li>\n</li> на временную маску №3
//			$text[^text.match[RegexpMaskA2\nRegexpMaskA1][gim]{RegexpMaskA3}]
			'/RegexpMaskA2\nRegexpMaskA1/' => 'RegexpMaskA3',

//			# -- добавляем ко всем оставшимся (открывающим и закрывающим) <li> и </li> <ul>
//			$text[^text.match[RegexpMaskA1][gim]{<ul><li>}]
//			$text[^text.match[RegexpMaskA2][gim]{</li></ul>}]
			'/RegexpMaskA1/' => '<ul><li>',
			'/RegexpMaskA2/' => '</li></ul>',

//			# -- меняем назад временную маску №3
//			$text[^text.match[RegexpMaskA3][gim]{</li>
//			<li>}]
			'/RegexpMaskA3/' => '</li><li>',

//			# ============ Нумерованный список ============
//			$text[^text.match[^^  \d+\.(.*)^$][gim]{RegexpMask1${match.1}RegexpMask2}]
			'/^  \d+\.(.*)$/m' => 'RegexpMask1$1RegexpMask2',

//			# -- меняем все <li>\n</li> на временную маску №3
//			$text[^text.match[RegexpMask2\nRegexpMask1][gim]{RegexpMask3}]
			'/RegexpMask2\nRegexpMask1/' => 'RegexpMask3',

//			# -- добавляем ко всем оставшимся (открывающим и закрывающим) <li> и </li> <ul>
//			$text[^text.match[RegexpMask1][gim]{<ol><li>}]
//			$text[^text.match[RegexpMask2][gim]{</li></ol>}]
			'/RegexpMask1/' => '<ol><li>',
			'/RegexpMask2/' => '</li></ol>',

//			# -- меняем назад временную маску №3
//			$text[^text.match[RegexpMask3][gim]{</li>
//			<li>}]
			'/RegexpMask3/' => '</li><li>',

//			# ============ Ссылки ============
			'/\[\[([^\s\[\]]*)[ ]([^\[\]]*)\]\]/m' => '<a href="$1">$2</a>',
			'/\(\(([^\s\(\)]*)[ ]([^\(\)]*)\)\)/m' => '<a href="$1">$2</a>',

//			# ============ Болд ============
			'~\*\*([^\n]+)\*\*~mU' => '<b>$1</b>',

//			# ============ Курсив ============
			'~(?<=\s|^)//(([^\n]+)*)//(?=\s|$)~mU' => '<i>$1</i>',

//			# ============ Спецсимволы ============
//			# -- меняем все { на временную маску №1
//			$text[^text.match[^{][g]{RegexpMask1}]
//
//			# -- меняем все двойные временные маски на {{
//			$text[^text.match[RegexpMask1RegexpMask1][g]{^{^{}]
//
//			# -- подставляем, если это кусок, ограниченный с двух сторон {{
//			$text[^text.match[
//				^{^{сноска:		# начинается с двух {{
//				([^^}\n]*)		# в середине любые символы, кроме }
//				^}^}			# заканчивается двумя }}
//			][gimx]{<span class="star">*</span><span class="footnote">$match.1</span>}]
//
//			$text[^text.match[
//				^{^{термин:		# начинается с двух {{
//				\s*([^^}]*)		# в середине любые символы, кроме }
//				^}^}			# заканчивается двумя }}
//			][gimx]{<a href="/words/?word=$match.1">$match.1</a>}]
//
//
//			# -- меняем все временные маски №1 на +
//			$text[^text.match[RegexpMask1][g]{<}]
		);

		return array(array_keys($hRules), array_values($hRules));
	}
}

?>